/* -*-jde-*- */
package ui.nuevoRegistro;

import app.alumnoe.AlumnoE;
import app.alumnoe.catalogos.beans.Carrera;
import app.alumnoe.catalogos.Carreras;
import app.alumnoe.catalogos.beans.UltimoGrado;
import app.alumnoe.catalogos.UltimosGrados;
import app.conexion.Conexion;
import app.conexion.ConexionException;
import app.empresa.Empresa;
import app.usuario.Usuario;
import app.usuario.beans.Correo;
import app.usuario.beans.Telefono;
import app.util.Fecha;
import app.util.appException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.LinkedList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;

/**
 *
 *
 * @author Victor Miguel Peralta Santa Anna
 * @since Enero 2012
 * @version 0.1
 */
@ManagedBean(name = "nuevoRegistroActionListener")
@SessionScoped
public class nuevoRegistroActionListener extends nuevoRegistroBean {

    /**
     * Creates a new instance of nuevoRegistroActionListener
     */
    public nuevoRegistroActionListener() {
        try {
            //Catalogo de carreras guardados en la base de datos
            //Conexion con = new Conexion();
            Carreras carreraClass = new Carreras();
            LinkedList<Carrera> carreras = carreraClass.getCarreras();

            UltimosGrados ultGradClass = new UltimosGrados();
            LinkedList<UltimoGrado> grados = ultGradClass.getUltimosGrados();

            //con.close();
            carreraCatalogo.clear();
            for (Carrera c : carreras) {
                carreraCatalogo.add(new SelectItem(c.getId(), c.getCarrera()));
            }

            //Catalogo ultimo Grado Académico
            ultimoGradoCatalogo.clear();
            for (UltimoGrado g : grados) {
                ultimoGradoCatalogo.add(new SelectItem(g.getId(), g.getGrado()));
            }

            alumEgreCatalogo.add(new SelectItem("1", "Alumno"));
            alumEgreCatalogo.add(new SelectItem("2", "Egresado"));
        } catch (appException ex) {
            Logger.getLogger(nuevoRegistroActionListener.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /**
     * Redirecciona la siguiente página dependiendo si se desea registrar una
     * nueva empresa o alumno
     *
     * @return
     */
    public String nextPage() {
        if (tipoNuevoUsuario.compareTo(NUEVO_ALUMNO) == 0) {
            return "/NuevoRegistro/NuevoAlumnoFormato?faces-redirect=true";
        } else {
            return "/NuevoRegistro/NuevaEmpresaFormato?faces-redirect=true";
        }

    }

    public String cancelar() {
        return "/login?faces-redirect=true";
    }

    private boolean corrervalidaciones(FacesContext context) {
        return validarContrasena(contrasena, contrasena2, context)
                && validarFechaNacimiento(fechaNac, context);
    }

    public String guardarNuevoAlumno() {

        FacesContext context = FacesContext.getCurrentInstance();

        try {
            //Revisar si el usuario está disponible
            //Conexion con = new Conexion();
            if (Usuario.isDisponible(numeroCuenta)) {
                if (corrervalidaciones(context) == false) {
                    return "";
                }
                //Si esta disponible guardar la información

                //Creamos primero el usuario general
                Usuario u = new Usuario(-1, numeroCuenta, contrasena, true, NUEVO_ALUMNO);
                u.save();

                //Creamos un Alumno en específico
                boolean estEgr = false;

                if (estudEgresado.compareTo("1") == 0) {
                    estEgr = true;
                } else {
                    estEgr = false;
                }
                Fecha f = new Fecha(fechaNac);
                AlumnoE a = new AlumnoE(u.getnIdUsuario(), Integer.valueOf(carreraId).intValue(),
                        Integer.valueOf(ultimogradoId).intValue(), estEgr, nombre, appat,
                        appmat, numeroCuenta, f, -1);
                a.save();

                //Agregamos el correo del alumno
                Correo correos = new Correo(-1, u.getnIdUsuario(), correo);
                correos.save();

                //Guardar telefonos
                Telefono tel = new Telefono(-1, u.getnIdUsuario(), telefono);
                tel.save();

                //con.close();
                return "/NuevoRegistro/ExitoNuevoRegistro?faces-redirect=true";
            } else {
                //Si no está disponible mandar un mensaje de error a la página de registro
                FacesMessage message = new FacesMessage();
                message.setSeverity(FacesMessage.SEVERITY_ERROR);
                message.setSummary("Numero de cuenta no es 3030");
                message.setDetail("El número de cuenta ya está registrado en el sistema");
                context.addMessage("nalumnoForm:nocta", message);

                //con.close();
                return "";
            }

        } catch (appException ex) {//Mandar error de la base de datos
            Logger.getLogger(nuevoRegistroActionListener.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }
    }

    //Validaciones de el nuevo registro de alumno*************************************************************
    /**
     * Valida que las contraseñas coincidan y que la primer contraseña tenga al
     * menos 5 caracteres
     *
     * @param pass1
     * @param pass2
     * @param context
     * @return
     */
    private boolean validarContrasena(String pass1, String pass2, FacesContext context) {
        //validamos la longitud de la contraseña        
        if (pass1.length() < 5) {
            FacesMessage message = new FacesMessage();
            message.setSeverity(FacesMessage.SEVERITY_ERROR);
            message.setDetail("La contraseña debe medir al menos 5 caracteres");
            context.addMessage("nalumnoForm:pass1", message);
            return false;
        }

        //validamos que las dos contraseñas sean las mismas
        if (pass1.compareTo(pass2) == 0) {
            return true;
        } else {
            FacesMessage message = new FacesMessage();
            message.setSeverity(FacesMessage.SEVERITY_ERROR);
            message.setDetail("Las contraseñas no coinciden");
            context.addMessage("nalumnoForm:pass2", message);
            return false;
        }
    }

    /**
     * Valida que el contenido de la fecha sea una fecha válida
     *
     * @param fecha
     * @param context
     * @return
     */
    private boolean validarFechaNacimiento(String fecha, FacesContext context) {
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        try {
            dateFormat.setLenient(false);
            Date d = dateFormat.parse(fecha);
            Calendar cal = Calendar.getInstance();
            cal.setTime(d);
            return true;
        } catch (Exception e) {
            FacesMessage message = new FacesMessage();
            message.setSeverity(FacesMessage.SEVERITY_ERROR);
            message.setDetail("Su fecha de nacimiento no es válida");
            context.addMessage("nalumnoForm:fec", message);
            return false;
        }
    }

    public String guardarEmpresa() {
        FacesContext context = FacesContext.getCurrentInstance();
        try {
            //Revisar si el usuario está disponible
            //Conexion con = new Conexion();
            if (Usuario.isDisponible(usuario)) {
//                if (corrervalidaciones(context) == false) {
//                    return "";
//                }                     

                //Creamos la nueva empresa en la tabla de usuarios
                Usuario u = new Usuario(-1, usuario, contrasena, true, NUEVO_EMPRESA);
                u.save();

                //Creamos la nueva empresa en la tabla de empresas
                Empresa e = new Empresa(u.getnIdUsuario(), getNombreEmpresa(),
                        getDescripcionEmpresa(), getRfcEmpresa(), getPagWebEmpresa(), getNombreContEmpresa(),
                        getCorreoEmpresa(), getTelEmpresa());
                e.save();

                //con.close();
                return "/NuevoRegistro/ExitoNuevoRegistro?faces-redirect=true";
            } else {
                //Si no está disponible mandar un mensaje de error a la página de registro
                FacesMessage message = new FacesMessage();
                message.setSeverity(FacesMessage.SEVERITY_ERROR);
                message.setDetail("El número de cuenta ya está registrado en el sistema");
                context.addMessage("empresaForm:user", message);

                //con.close();
                return "";
            }
        } catch (appException ex) {
            Logger.getLogger(nuevoRegistroActionListener.class.getName()).log(Level.SEVERE, null, ex);
            return "";
        }
    }
}
